package Solutions;

/***
 * 判断一个短字符串中的字符是否都在另外一个长字符串的字符集合中
 *
 * 用一个整型的变量来替代一个类似于hash表的结构，只能记录32个桶位
 * int hash = 0;
 * hash = 0000 0000 0000 0000 0000 0000 0000 0000
 * 这时它与另一个 1 左移某位的数按位或，会将对应的移动的位上的 0 改为 1
 * hash |= num; num = 1 << 0
 * hash = 0000 0000 0000 0000 0000 0000 0000 0000
 *        |
 * num  = 0000 0000 0000 0000 0000 0000 0000 0001  按位或 |
 * hash = 0000 0000 0000 0000 0000 0000 0000 0001
 *
 * hash |= num; num = 1 << 3
 * hash = 0000 0000 0000 0000 0000 0000 0000 0001
 *        |
 * num  = 0000 0000 0000 0000 0000 0000 0000 1000 按位或 |
 * hash = 0000 0000 0000 0000 0000 0000 0000 1001
 *
 * 由此可以推出：在得到的 hash 的二进制位上为 1 的，表示该数已经出现过
 * 可以将这个结构用于判断某个值在之前是否已经出现过，只需要将该值
 * 和 hash 值按位与即可，如果结果为 0 ，说明该值没有出现过，如果为
 * 1 则表明，该值在之前是出现过的。
 *
 * Which can indicate: in the bits of the hash of 1,
 * says the number has seen this structure can be used to
 * determine whether a value before you've already had,
 * just need to press the value and the hash value with can,
 * if the result is 0, that this value does not appear,
 * if 1 shows that the value is seen before.
 *
 * hash = 0000 0000 0000 0000 0000 0000 0000 1001
 *        &
 * tar  = 0000 0000 0000 0000 0000 0000 0000 0010  按位与 &
 * res  = 0000 0000 0000 0000 0000 0000 0000 0000  没有出现过
 *
 * hash = 0000 0000 0000 0000 0000 0000 0000 1001
 *        &
 * tar  = 0000 0000 0000 0000 0000 0000 0000 0001  按位与 &
 * res  = 0000 0000 0000 0000 0000 0000 0000 0001  出现过
 */
public class StringContain {

    public boolean stringContain(String str1, String str2) {
        int hash = 0;// 用一个整型数可以代替一个hash表 Use an integer can be instead of a hash table.
        // 计算得到一个数值，里面有位置信息
        for (int i = 0; i < str1.length(); i++) {
            hash |= (1 << (str1.charAt(i) - 'A'));
        }
        // 根据这个信息来做个判断另一个字符串中字符是否在之前的字符串字符集中
        for (int i = 0; i < str2.length(); i++) {
            if ((hash & (1 << (str2.charAt(i) - 'A'))) == 0) {
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {
        System.out.println(new StringContain().stringContain("aBCDEF","aBC"));
    }

}
